Las enfermedades renales crónicas representan un problema de salud
pública con un impacto creciente en Europa.
Al mismo tiempo, la calidad del agua puede verse afectada por diversos
factores:
La combinación de ambos dominios —medio ambiente y salud— permite estudiar si existe algún tipo de relación que pueda ser relevante para la prevención y gestión sanitaria.
El objetivo principal de este seminario es analizar la posible relación entre:
Para ello combinamos información procedente de bases de datos ambientales y sanitarias oficiales de la Unión Europea. Nuestro propósito es detectar patrones, correlaciones y tendencias que ayuden a comprender si la calidad del agua podría tener algún impacto sobre la salud renal de la población.
Los datos utilizados en este seminario provienen de dos fuentes oficiales europeas. Por un lado, los datos médicos proceden de Eurostat, accesibles mediante API.
Por otro lado, los datos medioambientales se han obtenido de la European Environment Agency (EEA) a través de su portal Data and Maps, donde pueden descargarse en formatos CSV, TSV, JSON y GeoJSON. Estos archivos se encuentran organizados dentro de la carpeta Input/DATA del repositorio para su posterior tratamiento en R.
Para poder utilizar estos conjuntos de datos y poder importarlos, utilizaremos las siguientes librerías:
library(eurostat)
library(xml2)
library(rjson)
library(dplyr)
library(ggplot2)
library(tidyr)
library(jsonlite)
library(furrr)
library(purrr)
library(future.apply)
library(plotly)
Con todas las librerías cargadas ya podemos importar los datos.
Importamos desde Eurostat un conjunto de datos oficiales sobre enfermedades renales, descargado automáticamente mediante su API. La función obtiene el dataset identificado como el segundo resultado relacionado con “renal” y lo carga en formato dataframe listo para analizar.
datos_nef_valores <- get_eurostat(search_eurostat("renal")[2], lang = "en")
## indexed 0B in 0s, 0B/sindexed 1.00TB in 0s, 1.25PB/s
Una vez obtenidos los datos y pudiendo ver su estructura, los modificaremos y ordenaremos de modo que sea más sencillo su manejo y comprensión.
El objetivo de este bloque de datos es conseguir que los años (TIME_PERIOD), que de forma predeterminada vienen en una única columna (date), estén correctamente formateados como valores numéricos y se puedan utilizar como variable temporal. Además, se renombran las columnas para que tengan nombres claros (icd9cm a enfermedades) y se eliminan columnas innecesarias (freq). Todo esto permite tener un dataframe limpio y estructurado, con cada registro asociado a un país y a un año, listo para su análisis.
#Eliminamos la columna freq, que solo tiene un nivel que se repite constantemente
datos_nef_valores$freq <- NULL
#Cambiamos el nombre a la columna icd9cm
datos_nef_valores <- datos_nef_valores %>%
rename(enfermedades = icd9cm)
#Cambiamos el nombre a la columna TIME_PERIOD
datos_nef_valores <- datos_nef_valores %>%
rename(date = TIME_PERIOD)
#Cambiamos formato de fecha
datos_nef_valores$date <- format(as.Date(datos_nef_valores$date), "%Y")
#Convertimos date a numeric
datos_nef_valores$date <- as.numeric(datos_nef_valores$date)
datos_nef_codigos <- get_eurostat(search_eurostat("renal")[2], lang = "en", type = "label")
## indexed 0B in 0s, 0B/sindexed 1.00TB in 0s, 1.59PB/s
datos_nef_codigos$freq <- NULL
datos_nef_codigos <- datos_nef_codigos %>%
rename(enfermedades = icd9cm)
datos_nef_codigos <- datos_nef_codigos %>%
rename(date = TIME_PERIOD)
datos_nef_codigos$date <- format(as.Date(datos_nef_codigos$date), "%Y")
datos_nef_codigos$date <- as.numeric(datos_nef_codigos$date)
#Visualización de estructura
str(datos_nef_valores)
## tibble [2,795 × 5] (S3: tbl_df/tbl/data.frame)
## $ unit : chr [1:2795] "NR" "NR" "NR" "NR" ...
## $ enfermedades: chr [1:2795] "CM3995" "CM3995" "CM3995" "CM3995" ...
## $ geo : chr [1:2795] "AT" "AT" "AT" "AT" ...
## $ date : num [1:2795] 1980 1981 1982 1983 1984 ...
## $ values : num [1:2795] 787 915 990 1158 1214 ...
str(datos_nef_codigos)
## tibble [2,795 × 5] (S3: tbl_df/tbl/data.frame)
## $ unit : chr [1:2795] "Number" "Number" "Number" "Number" ...
## $ enfermedades: chr [1:2795] "Haemodialysis" "Haemodialysis" "Haemodialysis" "Haemodialysis" ...
## $ geo : chr [1:2795] "Austria" "Austria" "Austria" "Austria" ...
## $ date : num [1:2795] 1980 1981 1982 1983 1984 ...
## $ values : num [1:2795] 787 915 990 1158 1214 ...
Importamos los datos de calidad del agua desde un archivo GeoJSON y los convertimos en un dataframe limpio y manejable en R. Primero, se leen todas las features del archivo, y para cada una se extraen sus propiedades (properties). Se reemplazan los valores NULL por NA para evitar problemas en el análisis y se convierten las listas resultantes en dataframes individuales. Finalmente, todos estos dataframes se combinan en un único dataframe (agua_data) que contiene todos los registros y atributos de interés, listo para ser filtrado, renombrado y analizado.
agua_data <- jsonlite::fromJSON("Data/DataExtract.geojson", simplifyVector = FALSE)
agua_data <- lapply(agua_data$features, function(feature){
pro <- feature$properties
pro <- lapply(pro, function(x) if (is.null(x)) NA else x)
as.data.frame(pro, stringAsFactor = FALSE)
}) %>%
bind_rows(.)
En este bloque se seleccionan únicamente las columnas que son relevantes para nuestro análisis de calidad del agua, eliminando información innecesaria. Posteriormente, se renombra la columna cArea como “Area_(km2)” para reflejar claramente que representa la superficie en kilómetros cuadrados. Finalmente, se filtran los registros eliminando las masas de agua costera (“CW”) y las de agua marítima territorial (“TeW”), ya que no son tipos de agua potable, por lo que interfieren en nuestro análisis.
agua_data <- select(agua_data, cYear, countryCode, fileUrl, euRBDCode, rbdName, euSubUnitCode, surfaceWaterBodyName, cArea, surfaceWaterBodyCategory,
reservoir, hasDescriptiveData, swEcologicalStatusOrPotentialValue, swChemicalStatusValue) %>%
dplyr::rename(., "Area_(km2)" = cArea) %>%
filter(!surfaceWaterBodyCategory %in% c("CW", "TeW"))
#Visualización de estructura
str(agua_data)
## 'data.frame': 278507 obs. of 13 variables:
## $ cYear : int 2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
## $ countryCode : chr "NO" "NO" "NO" "NO" ...
## $ fileUrl : chr "http://cdr.eionet.europa.eu/no/eu/wfd2016/districts/no5101/envwvqesq/SWB_NO_20180430.xml" "http://cdr.eionet.europa.eu/no/eu/wfd2016/districts/no5101/envwvqesq/SWB_NO_20180430.xml" "http://cdr.eionet.europa.eu/no/eu/wfd2016/districts/no5101/envwvqesq/SWB_NO_20180430.xml" "http://cdr.eionet.europa.eu/no/eu/wfd2016/districts/no5101/envwvqesq/SWB_NO_20180430.xml" ...
## $ euRBDCode : chr "NO5107" "NO5107" "NO5107" "NO5107" ...
## $ rbdName : chr "INNLANDET AND VIKEN" "INNLANDET AND VIKEN" "INNLANDET AND VIKEN" "INNLANDET AND VIKEN" ...
## $ euSubUnitCode : chr "NO5107" "NO5107" "NO5107" "NO5107" ...
## $ surfaceWaterBodyName : chr "STORHAAEN" "FJELLHAMARELVA - SAGELVA" "STIKKILLEN" "SIDEBEKKER TIL LEIRA NEDSTROEMS KROKFOSS" ...
## $ Area_(km2) : num 0.755 NA 0.953 NA 0.982 NA 0.535 NA 0.567 NA ...
## $ surfaceWaterBodyCategory : chr "LW" "RW" "LW" "RW" ...
## $ reservoir : chr "Inapplicable" "Inapplicable" "Inapplicable" "Inapplicable" ...
## $ hasDescriptiveData : int 1 1 1 1 1 1 1 1 1 1 ...
## $ swEcologicalStatusOrPotentialValue: chr "2" "5" "4" "4" ...
## $ swChemicalStatusValue : chr "Unknown" "Unknown" "Unknown" "Unknown" ...
colnames(agua_data)
## [1] "cYear" "countryCode"
## [3] "fileUrl" "euRBDCode"
## [5] "rbdName" "euSubUnitCode"
## [7] "surfaceWaterBodyName" "Area_(km2)"
## [9] "surfaceWaterBodyCategory" "reservoir"
## [11] "hasDescriptiveData" "swEcologicalStatusOrPotentialValue"
## [13] "swChemicalStatusValue"
Además, debido a la gran carga de datos y el tiempo de ejecución que supone, lo guardamos exportamos para optimizar el código.
# Guardamos el objeto de R para que en futuras ejecuciones no tarde tanto
saveRDS(object = agua_data, file = "Data/Datos_calidad_agua.rds")
# Carga de los datos SIN EJECUTAR TODO
agua_data <- readRDS(file = "Data/Datos_calidad_agua.rds")
Realizamos diversas comprobaciones y uniones para ver qué datos geográficos podemos utilizar como punto de unión para el análisis, y así poder compararlos con los datos del agua.
#COMPARACION DE PAISES ENTRE AMBAS BASES DE DATOS
#Vemos que paises tenemos en cada base de datos
unique(agua_data$countryCode)
## [1] "NO" "FI" "PL" "PT" "RO" "SE" "IS" "SI" "SK" "UK" "IT" "LT" "LV" "FR" "HR"
## [16] "HU" "IE" "LU" "ES" "EE" "EL" "DK" "AT" "BE" "BG" "CY" "DE" "CZ" "NL" "MT"
unique(datos_nef_valores$geo)
## [1] "AT" "BE" "BG" "CH" "CZ" "DE" "DK" "EL" "ES" "FI" "FR" "HR" "HU" "IE" "IS"
## [16] "IT" "LI" "LT" "LU" "MT" "NL" "PL" "PT" "RO" "RS" "SK" "TR" "UK" "EE"
paises_agua <- unique(agua_data$countryCode)
paises_nefro <- unique(datos_nef_valores$geo)
#Hacemos la interseccion para ver cuales son comunes
paises_comunes <- intersect(paises_agua, paises_nefro)
paises_comunes
## [1] "FI" "PL" "PT" "RO" "IS" "SK" "UK" "IT" "LT" "FR" "HR" "HU" "IE" "LU" "ES"
## [16] "EE" "EL" "DK" "AT" "BE" "BG" "DE" "CZ" "NL" "MT"
#Filtramos SOLO los países comunes
agua_data <- agua_data %>% filter(countryCode %in% paises_comunes)
agua_data <- group_by(agua_data, countryCode)
datos_nef_valores <- datos_nef_valores %>% filter(geo %in% paises_comunes)
str(datos_nef_valores)
## tibble [2,615 × 5] (S3: tbl_df/tbl/data.frame)
## $ unit : chr [1:2615] "NR" "NR" "NR" "NR" ...
## $ enfermedades: chr [1:2615] "CM3995" "CM3995" "CM3995" "CM3995" ...
## $ geo : chr [1:2615] "AT" "AT" "AT" "AT" ...
## $ date : num [1:2615] 1980 1981 1982 1983 1984 ...
## $ values : num [1:2615] 787 915 990 1158 1214 ...
str(agua_data)
## gropd_df [174,880 × 13] (S3: grouped_df/tbl_df/tbl/data.frame)
## $ cYear : int [1:174880] 2022 2022 2022 2022 2022 2022 2022 2022 2022 2022 ...
## $ countryCode : chr [1:174880] "FI" "FI" "FI" "FI" ...
## $ fileUrl : chr [1:174880] NA NA NA NA ...
## $ euRBDCode : chr [1:174880] "FIVHA1" "FIVHA1" "FIVHA1" "FIVHA1" ...
## $ rbdName : chr [1:174880] "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" ...
## $ euSubUnitCode : chr [1:174880] "FIVHA1" "FIVHA1" "FIVHA1" "FIVHA1" ...
## $ surfaceWaterBodyName : chr [1:174880] "KOTKATVESI" "VALKEINEN" "ALANNE" "ALA-LUOSTA" ...
## $ Area_(km2) : num [1:174880] 13.304 0.562 10.01 9.72 1.578 ...
## $ surfaceWaterBodyCategory : chr [1:174880] NA NA NA NA ...
## $ reservoir : chr [1:174880] NA NA NA NA ...
## $ hasDescriptiveData : int [1:174880] 0 0 0 0 0 0 0 0 0 0 ...
## $ swEcologicalStatusOrPotentialValue: chr [1:174880] NA NA NA NA ...
## $ swChemicalStatusValue : chr [1:174880] NA NA NA NA ...
## - attr(*, "groups")= tibble [25 × 2] (S3: tbl_df/tbl/data.frame)
## ..$ countryCode: chr [1:25] "AT" "BE" "BG" "CZ" ...
## ..$ .rows : list<int> [1:25]
## .. ..$ : int [1:16305] 22690 22691 22694 22695 22696 22697 22698 22699 22700 22701 ...
## .. ..$ : int [1:1110] 22692 22693 22706 22823 22824 25621 25623 25624 25636 25637 ...
## .. ..$ : int [1:1876] 22707 23546 26273 26274 26275 26276 26277 26278 26279 26280 ...
## .. ..$ : int [1:2239] 22726 22727 26297 26298 26299 26300 26301 26313 26314 26315 ...
## .. ..$ : int [1:19399] 22725 22728 22729 22730 22731 22732 22733 22734 22735 22736 ...
## .. ..$ : int [1:16321] 22594 22599 22605 22617 22748 22749 22750 22751 22752 22753 ...
## .. ..$ : int [1:1462] 22586 22587 22588 22591 22592 22593 22624 22634 22635 22636 ...
## .. ..$ : int [1:2858] 22589 22590 22595 22596 22597 22600 22601 22602 22603 22604 ...
## .. ..$ : int [1:10112] 22410 22419 22420 22441 22460 22461 22462 22470 22472 22473 ...
## .. ..$ : int [1:13406] 1 2 3 4 5 6 7 8 9 10 ...
## .. ..$ : int [1:22462] 21813 21814 21902 21996 21997 22030 22031 22039 22040 22078 ...
## .. ..$ : int [1:3442] 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 ...
## .. ..$ : int [1:2150] 21826 21887 21888 21924 21925 21950 21966 21967 22013 22014 ...
## .. ..$ : int [1:8414] 21827 21828 21889 21926 21951 21968 21969 21970 21971 22016 ...
## .. ..$ : int [1:2403] 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 ...
## .. ..$ : int [1:15382] 21803 21829 21830 21831 21832 21833 21890 21891 21892 21927 ...
## .. ..$ : int [1:2374] 21804 21805 21806 21807 21808 21834 21835 21836 21837 21838 ...
## .. ..$ : int [1:216] 21840 21935 48810 48811 48814 48815 48816 48817 48819 48820 ...
## .. ..$ : int [1:20] 48812 48813 61459 61460 62074 74813 74814 74815 92715 103999 ...
## .. ..$ : int [1:1434] 48235 48237 48238 48239 48240 48241 48242 48787 48788 48789 ...
## .. ..$ : int [1:9875] 46 47 48 49 51 52 53 54 55 56 ...
## .. ..$ : int [1:3951] 1170 1171 1172 1173 1174 1175 1176 1177 1179 1180 ...
## .. ..$ : int [1:6044] 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 ...
## .. ..$ : int [1:2861] 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 ...
## .. ..$ : int [1:8764] 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 ...
## .. ..@ ptype: int(0)
## ..- attr(*, ".drop")= logi TRUE
# Unión
datos_combinados <- right_join(agua_data, datos_nef_valores,
by = c("countryCode" = "geo"))
## Warning in right_join(agua_data, datos_nef_valores, by = c(countryCode = "geo")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 174 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
str(datos_combinados)
## gropd_df [22,095,218 × 17] (S3: grouped_df/tbl_df/tbl/data.frame)
## $ cYear : int [1:22095218] 2022 2022 2022 2022 2022 2022 2022 2022 2022 2022 ...
## $ countryCode : chr [1:22095218] "FI" "FI" "FI" "FI" ...
## $ fileUrl : chr [1:22095218] NA NA NA NA ...
## $ euRBDCode : chr [1:22095218] "FIVHA1" "FIVHA1" "FIVHA1" "FIVHA1" ...
## $ rbdName : chr [1:22095218] "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" "VUOKSI RIVER BASIN DISTRICT" ...
## $ euSubUnitCode : chr [1:22095218] "FIVHA1" "FIVHA1" "FIVHA1" "FIVHA1" ...
## $ surfaceWaterBodyName : chr [1:22095218] "KOTKATVESI" "KOTKATVESI" "KOTKATVESI" "KOTKATVESI" ...
## $ Area_(km2) : num [1:22095218] 13.3 13.3 13.3 13.3 13.3 ...
## $ surfaceWaterBodyCategory : chr [1:22095218] NA NA NA NA ...
## $ reservoir : chr [1:22095218] NA NA NA NA ...
## $ hasDescriptiveData : int [1:22095218] 0 0 0 0 0 0 0 0 0 0 ...
## $ swEcologicalStatusOrPotentialValue: chr [1:22095218] NA NA NA NA ...
## $ swChemicalStatusValue : chr [1:22095218] NA NA NA NA ...
## $ unit : chr [1:22095218] "NR" "NR" "NR" "NR" ...
## $ enfermedades : chr [1:22095218] "CM3995" "CM3995" "CM3995" "CM3995" ...
## $ date : num [1:22095218] 1980 1981 1982 1983 1984 ...
## $ values : num [1:22095218] 223 256 305 398 395 458 463 514 542 554 ...
## - attr(*, "groups")= tibble [25 × 2] (S3: tbl_df/tbl/data.frame)
## ..$ countryCode: chr [1:25] "AT" "BE" "BG" "CZ" ...
## ..$ .rows : list<int> [1:25]
## .. ..$ : int [1:3326220] 2587011 2587012 2587013 2587014 2587015 2587016 2587017 2587018 2587019 2587020 ...
## .. ..$ : int [1:124320] 2587419 2587420 2587421 2587422 2587423 2587424 2587425 2587426 2587427 2587428 ...
## .. ..$ : int [1:11256] 2590203 2590204 2590205 2590206 2590207 2590208 2754483 2754484 2754485 2754486 ...
## .. ..$ : int [1:138818] 2593755 2593756 2593757 2593758 2593759 2593760 2593761 2593762 2593763 2593764 ...
## .. ..$ : int [1:1513122] 2593677 2593678 2593679 2593680 2593681 2593682 2593683 2593684 2593685 2593686 ...
## .. ..$ : int [1:2252298] 2568963 2568964 2568965 2568966 2568967 2568968 2568969 2568970 2568971 2568972 ...
## .. ..$ : int [1:17544] 2568567 2568568 2568569 2568570 2568571 2568572 2568573 2568574 2568575 2568576 ...
## .. ..$ : int [1:462996] 2568603 2568604 2568605 2568606 2568607 2568608 2568609 2568610 2568611 2568612 ...
## .. ..$ : int [1:2062848] 2532663 2532664 2532665 2532666 2532667 2532668 2532669 2532670 2532671 2532672 ...
## .. ..$ : int [1:2734824] 1 2 3 4 5 6 7 8 9 10 ...
## .. ..$ : int [1:3773616] 2451598 2451599 2451600 2451601 2451602 2451603 2451604 2451605 2451606 2451607 ...
## .. ..$ : int [1:247824] 2451934 2451935 2451936 2451937 2451938 2451939 2451940 2451941 2451942 2451943 ...
## .. ..$ : int [1:348300] 2452726 2452727 2452728 2452729 2452730 2452731 2452732 2452733 2452734 2452735 ...
## .. ..$ : int [1:471184] 2452888 2452889 2452890 2452891 2452892 2452893 2452894 2452895 2452896 2452897 ...
## .. ..$ : int [1:497421] 122091 122092 122093 122094 122095 122096 122097 122098 122099 122100 ...
## .. ..$ : int [1:1015212] 2451086 2451087 2451088 2451089 2451090 2451091 2451092 2451093 2451094 2451095 ...
## .. ..$ : int [1:80716] 2451152 2451153 2451154 2451155 2451156 2451157 2451158 2451159 2451160 2451161 ...
## .. ..$ : int [1:8208] 2453534 2453535 2453536 2453537 2453538 2453539 2453540 2453541 2453542 2453543 ...
## .. ..$ : int [1:80] 6508417 6508418 6508419 6508420 6508421 6508422 6508423 6508424 8119624 8119625 ...
## .. ..$ : int [1:245214] 6409879 6409880 6409881 6409882 6409883 6409884 6409885 6409886 6409887 6409888 ...
## .. ..$ : int [1:237000] 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 ...
## .. ..$ : int [1:644013] 38857 38858 38859 38860 38861 38862 38863 38864 38865 38866 ...
## .. ..$ : int [1:302200] 76797 76798 76799 76800 76801 76802 76803 76804 76805 76806 ...
## .. ..$ : int [1:160216] 126231 126232 126233 126234 126235 126236 126237 126238 126239 126240 ...
## .. ..$ : int [1:1419768] 139596 139597 139598 139599 139600 139601 139602 139603 139604 139605 ...
## .. ..@ ptype: int(0)
## ..- attr(*, ".drop")= logi TRUE
#Resumen datos de agua por país
agua_resumen <- agua_data %>%
group_by(countryCode) %>%
summarise(
Area_total = sum(`Area_(km2)`, na.rm = TRUE),
swEcologicalStatus_promedio = mean(
as.numeric(swEcologicalStatusOrPotentialValue[grepl("^[0-9]+$", swEcologicalStatusOrPotentialValue)]),
na.rm = TRUE
),
swChemicalStatus_promedio = mean(
as.numeric(swChemicalStatusValue[grepl("^[0-9]+$", swChemicalStatusValue)]),
na.rm = TRUE
)
)
#Resumen datos renales por país
nefro_resumen <- datos_nef_valores %>%
group_by(geo) %>%
summarise(total_casos_renales = sum(values, na.rm = TRUE))
#Unión final de los datos resumidos
datos_combinados_final <- agua_resumen %>%
full_join(nefro_resumen, by = c("countryCode" = "geo"))
str(datos_combinados_final)
## tibble [25 × 5] (S3: tbl_df/tbl/data.frame)
## $ countryCode : chr [1:25] "AT" "BE" "BG" "CZ" ...
## $ Area_total : num [1:25] 1046 183 1040 544 6427 ...
## $ swEcologicalStatus_promedio: num [1:25] 2.48 3.4 2.8 3.27 3.64 ...
## $ swChemicalStatus_promedio : num [1:25] 3 2.99 2.17 2.41 3 ...
## $ total_casos_renales : num [1:25] 340313 213327 16682 202177 1815105 ...
View(datos_combinados_final)
#GRÁFICO ESTADO QUÍMICO Y ECOLÓGICO VS CASOS RENALES.
# Crear el gráfico de burbujas
p <- ggplot(datos_combinados_final, aes(
x = swChemicalStatus_promedio, # eje x = estado químico
y = swEcologicalStatus_promedio, # eje y = estado ecológico
size = total_casos_renales, # tamaño = casos renales
color = swChemicalStatus_promedio, # color opcional
text = paste(
"<b>", countryCode, "</b><br>",
"Casos renales: ", total_casos_renales, "<br>",
"Estado ecológico: ", round(swEcologicalStatus_promedio,2), "<br>",
"Estado químico: ", round(swChemicalStatus_promedio,2)
)
)) +
geom_point(alpha = 0.8) +
scale_size_continuous(range = c(5, 25)) + # Ajusta según la magnitud de los datos
scale_color_viridis_c(option = "plasma", na.value = "lightgrey") +
theme_minimal() +
labs(
x = "Estado químico",
y = "Estado ecológico",
size = "Casos renales",
color = "Estado químico"
)
# Convertir a interactivo
p_interactivo <- ggplotly(p, tooltip = "text")
p_interactivo
#GRÁFICA:Heatmap de correlaciones entre variables del agua y casos renales
# Seleccionar solo las columnas numéricas relevantes
datos_corr <- datos_combinados_final %>%
select(
swEcologicalStatus_promedio,
swChemicalStatus_promedio,
Area_total,
total_casos_renales
)
# Calcular matriz de correlaciones
matriz_corr <- round(cor(datos_corr, use = "pairwise.complete.obs"), 2)
# Pasamos a formato largo
matriz_corr_long <- as.data.frame(matriz_corr) %>%
mutate(Var1 = rownames(.)) %>%
pivot_longer(-Var1, names_to = "Var2", values_to = "Correlacion")
# Heatmap
ggplot(matriz_corr_long, aes(x = Var1, y = Var2, fill = Correlacion)) +
geom_tile(color = "white") +
geom_text(aes(label = Correlacion), color = "black", size = 5) +
scale_fill_viridis_c(option = "plasma", limits = c(-1,1)) +
theme_minimal(base_size = 13) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_blank(),
panel.grid = element_blank()
) +
labs(
fill = "Correlación",
title = "Heatmap de correlaciones entre calidad del agua y casos renales"
)
Tras el análisis detallado de los datos y la observación de las gráficas proporcionadas, se puede inferir que, en el contexto de los países europeos, la calidad del agua no parece tener un impacto significativo en la incidencia de enfermedades renales. Esto sugiere que otros factores, posiblemente relacionados con hábitos de vida, genética, atención médica o condiciones socioeconómicas, podrían desempeñar un papel más determinante en la aparición de estas patologías. Por lo tanto, aunque la calidad del agua sigue siendo un aspecto importante para la salud pública en general, en este caso específico no se observa una relación directa y significativa con los problemas renales.